1. Background and Relevant Art
Computer systems and related technology affect many aspects of society. Indeed, the computer system's ability to process information has transformed the way we live and work. Computer systems now commonly perform a host of tasks (e.g., word processing, scheduling, accounting, etc.) that prior to the advent of the computer system were performed manually. More recently, computer systems have been coupled to one another and to other electronic devices to form both wired and wireless computer networks over which the computer systems and other electronic devices can transfer electronic data. Accordingly, the performance of many computing tasks is distributed across a number of different computer systems and/or a number of different computing environments.
During code development, software developers often use Application Programming Interfaces (APIs) to facilitate communication between software components. An API can include a specification for routines, data structures, object classes, and variables associated with the API. As such, one developer can use an API specification to determine how to call an API written by another developer.
Often, one software developer (a library developer) develops code having a number of related APIs that are grouped into a library offering specified functionality. The software developer can make parts of the functionality available to other programs by exposing corresponding APIs within the library as public APIs. Thus, another developer (an application developer) can access the available parts of functionality from within their code through calls to the public APIs. The software developer can also maintain other parts of the functionality as private. The private functionality can be used internally between APIs within the library or to access other private APIs in other libraries. APIs providing the private functionality are not directly exposed to other programs.
However, many runtime environments permit code to dynamically call any API in a third party library (e.g., using reflection to access metadata). As such, an application program or library can identify and call private APIs within another library. When a software developer maintains an API is private, the software developer does not expect the API to be externally called. Unfortunately, servicing or versioning changes to internal implementation details of such libraries, such as, for example, renames or removals of private methods, have the potential of causing breaking changes in applications using these libraries.
In addition, runtime support for dynamic calls carries a size and working set overhead (e.g., metadata). The size and working set overhead is maintained for APIs (private or public) whether or not the APIs are actually called dynamically. Maintaining size and working set overhead for uncalled APIs unnecessarily consumes computing resources.